// @ts-ignore
import aes from 'crypto-js/aes'
import enc from 'crypto-js/enc-utf8'
import {saveAs} from "file-saver";
import dayjs from "dayjs";

const KEY = "Collab-Vision"


/**
 * 加密
 * @param message
 */
export const encrypt = (message: string) => {
    return aes.encrypt(message, KEY).toString();
}

/**
 * 解密
 * @param message
 */
export const decrypt = (message: string) => {
    return aes.decrypt(message, KEY).toString(enc)
}

/**
 * 下载图片
 * @param url 图片下载地址
 * @param fileName 要保存为的文件名
 */
export function downloadImage(url?: string, fileName?: string) {
    if (!url) {
        return
    }
    saveAs(url, fileName)
}

/**
 * 下载base64格式图片
 * @param base64Data base64格式的图片数据
 * @param fileName 要保存为的文件名
 */
export function downloadImageBase64(base64Data: string, fileName: string = 'image.png') {
    // 检查base64字符串是否有效
    if (!base64Data || !base64Data.startsWith('data:image/')) {
        console.error('无效的base64图片数据')
        return
    }
    
    try {
        // 从base64字符串提取MIME类型
        const mimeMatch = base64Data.match(/^data:([^;]+);base64,/)
        if (!mimeMatch) {
            throw new Error('无法识别图片格式')
        }
        
        const mimeType = mimeMatch[1]
        // 提取base64编码部分
        const base64Content = base64Data.replace(/^data:[^;]+;base64,/, '')
        
        // 将base64转换为Blob对象
        const byteCharacters = atob(base64Content)
        const byteArrays = []
        
        for (let offset = 0; offset < byteCharacters.length; offset += 512) {
            const slice = byteCharacters.slice(offset, offset + 512)
            
            const byteNumbers = new Array(slice.length)
            for (let i = 0; i < slice.length; i++) {
                byteNumbers[i] = slice.charCodeAt(i)
            }
            
            const byteArray = new Uint8Array(byteNumbers)
            byteArrays.push(byteArray)
        }
        
        const blob = new Blob(byteArrays, { type: mimeType })
        
        // 使用file-saver保存文件
        saveAs(blob, fileName)
    } catch (error) {
        console.error('下载base64图片失败:', error)
    }
}

/**
 * 时间格式化
 * @param date
 * @param format
 */
export function formatTime(date: Date | string, format: string) {
    return dayjs(date).format(format)
}

/**
 * 格式化文件大小
 * @param size
 */
export function formatSize(size?: number){
    if (!size) return '未知'
    if (size < 1024) return size + ' B'
    if (size < 1024 * 1024) return (size / 1024).toFixed(2) + ' KB'
    return (size / (1024 * 1024)).toFixed(2) + ' MB'
}

/**
 * 将数字格式化为5位字符串，不足5位时前面补0
 * @param num 要格式化的数字
 * @returns 格式化后的5位字符串
 */
export function formatNumber(num: number): string {
    return num.toString().padStart(5, '0');
}

/**
 * 将颜色值转换为标准 #RRGGBB 格式
 * @param input
 */
export function toHexColor(input: string) {
    // 去掉 0x 前缀
    const colorValue = input.startsWith('0x') ? input.slice(2) : input

    // 将剩余部分解析为十六进制数，再转成 6 位十六进制字符串
    const hexColor = parseInt(colorValue, 16).toString(16).padStart(6, '0')

    // 返回标准 #RRGGBB 格式
    return `#${hexColor}`
}